AWS Transfer Family のPassiveIpパラメータの概要と設定変更が必要・不要なケースをまとめてみた
はじめに
AWS Transfer Family for FTPおよびFTPS サーバーのPassiveIpパラメータについて、その概要と設定変更が必要なケース、不要なケースについてまとめました。
PassiveIpについて
先に、FTPパッシブモードでのファイル転送までの流れを説明します。おおよそ下記の通りです。
- クライアントがコントロールコネクション(ポート21)を介してPASVコマンドでパッシブモード接続をリクエストします
- サーバーはデータコネクションの接続先のIPアドレスとポート番号(Transfer Familyの場合、8192〜8200)を返します。
- クライアントは返されたIPアドレスとポート番号をもとにデータコネクションを介してサーバーに接続することで、ファイル転送が可能になります。
FTPにおけるアクティブモードとパッシブモードの違いは、以下のサイトがわかりやすいので、参考にしてください。
クライアントに対して、Transfer Familyサーバーがデータコネクションの接続先のIPアドレスを返す値は、Transfer FamilyのPassiveIpで指定します。
PassiveIpの指定値は、以下の3つの選択肢があります。
PassiveIp=AUTO
PassiveIp=単一のIPアドレス
PassiveIp=0.0.0.0
PassiveIp=AUTO
PassiveIp=AUTO
は、デフォルト値です。この設定では、Transfer Familyサーバーが自動的にエンドポイントIPのいずれかを選択してPASV応答(データコネクションの接続先のIPアドレスとポート番号をクライアントに返す)を行います。
エンドポイントIPは、Transfer Familyサーバーがクライアントに接続を提供するために使用するIPアドレスです。Transfer Familyサーバーが作成されると、VPCエンドポイントがエンドポイントIPとして作成されます。
EC2→Transfer Family→S3などの一般的な構成であれば、PassiveIpは、デフォルト値で問題ありません。
PassiveIpの変更が必要なケース
PassiveIpの設定値はAUTO以外の選択肢として、単一のIPアドレス、もしくは、0.0.0.0があります。
PassiveIpに単一のIPアドレスを指定するケースとして、NLBを利用している構成でNLBのプライベートIPを指定することが挙げられます。
ほかには、AWS PrivateLinkを利用する構成でもNLBのプライベートIPを指定するケースがあります。
ただし、PassiveIpを単一のIPアドレスにすると、NLBが複数のサブネット上にある高可用性の場合、サブネットごとにTransfer Familyサーバーを作成する必要があります。
PassiveIp=0.0.0.0
とすると、クライアントはコントロールコネクションと同じIPアドレスを使用するようになり、複数のサブネット上にNLBがある場合も接続可能になります。
注意点
ただし、すべてのFTPクライアントがPassiveIp=0.0.0.0
という応答をサポートしているわけではありません。
AWSドキュメントでは、FileZillaとWinSCPはサポートされていると記載されております。
ただし、すべての FTP クライアントが PassiveIp=0.0.0.0 応答をサポートしているわけではないことに注意してください。FileZilla と WinSCP はそれをサポートしています。他のクライアントを使用している場合は、そのクライアントが PassiveIp=0.0.0.0 応答をサポートしているかどうかを確認してください。引用
サポートされていない場合、PassiveIp=NLBのIP
の通り、NLBの1つのプライベートIPを指定します。複数サブネットの場合、Transfer Familyサーバーを複数作成し、サブネットごとに存在するNLBのプライベートIPをPassiveIp=NLBのIP
として設定する必要があります。
試してみた
以前、Transfer Family for FTP を AWS PrivateLink経由でファイル転送する構成を構築しましたので、この構成を利用して、PassiveIp=0.0.0.0の設定変更を試してみました。 構築方法は、下記のブログをご参考ください。
上記の構成を構築後、PassiveIp=0.0.0.0
に変更します。
設定変更後は、Transfer Familyを再起動します。
停止の後、開始をすると再起動が完了です。
FTP接続
AWS PrivateLinkを利用する構成において、EC2(Amazon Linux2)でftpコマンドを実行し、PassiveIp=0.0.0.0
がサポートされているか確認します。
ftpパッケージをインストールします。
$ sudo yum install -y ftp Installed: ftp.x86_64 0:0.17-67.amzn2.0.2 Complete!
ftpコマンドを利用し接続します。接続先は、VPCエンドポイント(AWS PrivateLinkの利用側)です。
$ ftp vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com Connected to vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com (10.1.135.46). 220 Service ready for new user. Name (vpce-09de7f41eb073a17e-r95udb03.vpce-svc-04ec99342c0977f6c.ap-northeast-1.vpce.amazonaws.com:ec2-user): class 331 User name okay, need password for class. Password: 230 User logged in, proceed. Remote system type is UNIX. ftp> pwd 257 "/" is current directory. ftp> cd s3バケット 250 Directory changed to /s3バケット ftp> ls 227 Entering Passive Mode (0,0,0,0,32,5) ftp: connect: Connection refused
結果として接続できなかったため、ftpコマンドはPassiveIp=0.0.0.0
をサポートしていないと考えられます。
PassiveIpの設定変更が不要なケース(クライアント側の設定)
NLBを間に挟む構成の場合でも、PassiveIpの設定変更が不要なケースもあります。
AWS PrivateLinkを利用したTransfer Family経由でのファイル転送の場合、Transfer Familyサーバー側のPassiveIpの設定がデフォルト値(AUTO)のままであっても、クライアント側の設定によってファイル転送が可能なFTPクライアントが存在します。以下の2点を紹介します。
- lftp
- WinSCP
lftp
FTPクライアントが拡張パッシブモード(EPSV)を利用できる場合、PASV応答はポート番号のみとなり、PassiveIpのプライベートIPが返却される問題が発生しません。
lftpは、拡張パッシブモードをサポートしていますので、PassiveIpがデフォルト値(AUTO)でもFTP接続しファイル転送可能です。下記の記事では、lftpコマンドでファイル転送しています。
WinSCP
WinSCPでは、「パッシブモードでIPアドレスを強制 (Force IP Address for passive mode)」をON
と設定することで、コントロールコネクションと同じIPアドレスを利用するため、デフォルト値(AUTO)でもFTP接続しファイル転送可能でした。
ファイル転送できています。
ただし、設定がON
ではなくAUTO
やNO
にした場合、PassiveIpが0.0.0.0やNLBのIPであっても接続できません。
「パッシブモードでIPアドレスを強制」について、ドキュメントにも記載がありました。
パッシブ モード接続の強制 IP アドレスは 、WinSCP がサーバーによって提供される IP アドレスの代わりに FTP ホストの外部 IP アドレスを使用するかどうかを制御します。これは、IP アドレスが変換される ( NAT ) 場合に便利です。このオプションはパッシブ モードでのみ使用できます。Autoに設定すると、指定された IP アドレスがルーティングできない場合、WinSCP は外部 IP アドレスを自動的に使用します。引用(日本語訳)
最後に
AWS Transfer Family のPassiveIpパラメータについて解説しました。
EC2からTransfer Familyを経由してS3にアクセスする一般的な構成では、デフォルトのPassiveIp設定で問題ありません。
しかし、AWS PrivateLinkなどでNLBを経由する場合は、クライアント側の設定やPassiveIpの設定に注意が必要です。